home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 November / Chip Kasım 2001.iso / prog / cdcode / vmware / setup.exe / data1.cab / WGS_PerlRuntime / vmware-control < prev   
Encoding:
Text File  |  2001-09-19  |  8.6 KB  |  325 lines

  1. #!/usr/bin/perl -w -Iblib/arch -Iblib/lib -I/usr/lib/perl5/5.6.0/i386-linux -I/usr/lib/perl5/5.6.0 -I. 
  2. #
  3. # Copyright (C) 1999-2001 VMware, Inc.
  4. # All Rights Reserved
  5. #
  6. # $Id: vmx.pl,v 1.33 2001/08/07 20:17:52 lazlo Exp $
  7.  
  8. # Return the specific VMware product
  9. sub vmware_product {
  10.   return '@@PRODUCT@@';
  11. }
  12.  
  13. BEGIN {
  14.   if ( $^O eq "MSWin32" ) {
  15.     my $PREFIX_PATH;
  16.     if (-d '%winlibdir%') {
  17.       $PREFIX_PATH = '%winlibdir%';
  18.     } else {
  19.       $PREFIX_PATH = 'C:\Progra~1\VMware\VMware~1\Programs';
  20.     }
  21.     @INC = ("$PREFIX_PATH/5.00503/lib",
  22.         "$PREFIX_PATH/5.00503/lib/MSWin32-x86",
  23.         "$PREFIX_PATH/site/5.00503/lib",
  24.         "$PREFIX_PATH/site/5.00503/lib/MSWin32-x86",
  25.         "$PREFIX_PATH/vmware/perlroot",
  26.         '.'
  27.         );
  28.   }
  29.  
  30.     # Should be set to true only if you have a version of the Perl
  31.     # interpreter derived from version 5.005 (ie. 5.00503 or 5.00504).
  32.     if( vmware_product() eq 'server' ) {
  33.        push(@INC, "/usr/lib/vmware/perl5/site_perl/5.005");
  34.        push(@INC, "/usr/lib/vmware/perl5/site_perl/5.005/i386-linux");
  35.     }
  36.  
  37.    # VMware internal development -- redirect Perl to find devel modules
  38.    if (defined($ENV{TEST_TREE})) {
  39.       if (-d $ENV{TEST_TREE} . "/apps/perl-control/blib/arch") {
  40.          print STDERR "Using TEST_TREE for Perl API: $ENV{TEST_TREE}\n";
  41.          unshift(@INC, $ENV{TEST_TREE} . "/apps/perl-control/blib/lib");
  42.          unshift(@INC, $ENV{TEST_TREE} . "/apps/perl-control/blib/arch");
  43.       } else {
  44.          print STDERR "** Warning: TEST_TREE Perl API not found: $ENV{TEST_TREE}\n";
  45.       }
  46.    }
  47. }
  48.  
  49. use strict;
  50. use 5.004;
  51.  
  52. my $verbose = 0;
  53. my $quiet = 0;
  54.  
  55. my $hostname = undef;
  56. my $port = 0;
  57. my $username = undef;
  58. my $password = undef;
  59.  
  60. my $extension = ( $^O eq "MSWin32" ) ? ".vmx" : ".cfg";
  61. my $dirsep = ( $^O eq "MSWin32" ) ? "\\" : "/";
  62.  
  63. sub usage {
  64.     print STDERR "Usage: $0 <vmware-control-options> <vm-cfg-path> <vm-action> <arguments>\n";
  65.     print STDERR "       $0 -s <vmware-control-options> <server-action> <arguments>\n";
  66.     print STDERR "\n";
  67.     print STDERR "  For example:\n";
  68.     print STDERR "       $0 -l                    -- lists VMs on the local server\n";
  69.     print STDERR "       $0 -s register foo$extension   -- register a VM on the local server\n";
  70. #    print STDERR "       $0 -s enumerate    -- lists VMs on the local server\n";
  71. #    print STDERR "       $0 -s exec <XML>   -- send XML to vmware-serverd\n";
  72.     print STDERR "\n       $0 -v $dirsep" . "home$dirsep" . "vmware$dirsep" . "win2000$extension start\n";
  73.     print STDERR "       $0 -q $dirsep" . "home$dirsep" . "vmware$dirsep" . "win2000$extension get Status.power\n";
  74.     exit(255);
  75. }       
  76.  
  77. sub pretty_print {
  78.     while (defined($_ = shift)) {
  79.         if (ref($_)) {
  80.             print "[ ";
  81.             if (ref($_) eq "ARRAY") {
  82.                 pretty_print(@{$_});
  83.             } elsif (ref($_) eq "HASH") {
  84.                 pretty_print(%{$_});
  85.             } else {
  86.                 pretty_print(${$_});
  87.             }
  88.             print "] ";
  89.         } else {
  90.             print $_, " ";
  91.         }
  92.     }
  93. }                                                                                                                      
  94.  
  95. sub check_version {
  96.     my $v = VMware::Control::version();
  97.     if (! $v) {
  98.         print STDERR "$0: Could not run Perl VMware::Control module\n";
  99.         exit(255);
  100.     }
  101.  
  102.     print "API Version: ",$v,"\n" if ($verbose);
  103. }
  104.  
  105. sub get_server_local {
  106.     check_version();
  107.  
  108. #    my $vms = &VMware::Control::Server::new();
  109.     my $vms = &VMware::Control::Server::new($hostname, $port, $username, $password);
  110.  
  111.     return $vms;
  112. }
  113. sub connect_server_local {
  114.  
  115.     my $vms = get_server_local();
  116.  
  117.     if (! $vms || ! $vms->connect()) {
  118.         my ($err, $errstr) = $vms->get_last_error();
  119.         print STDERR "$0: Could not connect to vmware-authd\n";
  120.         print STDERR "  (VMControl error $err: $errstr)\n";
  121.         exit(-$err);
  122.     }
  123.     return $vms;
  124. }
  125.  
  126. sub do_list {
  127.     my $vms = connect_server_local();
  128.  
  129.     my @list = $vms->enumerate();
  130.  
  131.     if (!defined($list[0])) {
  132.         my ($err, $errstr) = $vms->get_last_error();
  133.         print STDERR "VMControl error $err: $errstr\n";
  134.     $vms->disconnect( );
  135.         exit(-$err);
  136.     }
  137.  
  138.     while($_ = shift @list) {
  139.         print $_,"\n";
  140.     }
  141.     $vms->disconnect( );
  142. }
  143.  
  144. sub do_server_action {
  145.     my @args = @_;
  146.     
  147.     my $vms = get_server_local();
  148.  
  149.     if ($args[0] eq "register" || $args[0] eq "unregister") {
  150.         if ( $^O eq "linux" && ! $args[1] =~ m%^/% ) {
  151.             #Relative path --> absolute path (Linux)
  152.             my $cwd;
  153.             chomp($cwd = `pwd`);
  154.             $args[1] = $cwd . "/" . $args[1];
  155.         }
  156.     }
  157.  
  158.     do_action($vms, @args);
  159. }
  160.  
  161. sub do_vm_action {
  162.     my $vmid = shift;
  163.     my @args = @_;
  164.     
  165.     my $vms;
  166.     if( vmware_product() eq 'server' ) {
  167.         $vms = connect_server_local(); #XXX bad interface
  168.     } else {
  169.         $vms = get_server_local();
  170.     }
  171.  
  172.     my $vm = &VMware::Control::VM::new($vms, $vmid);
  173.  
  174.     do_action($vm, @args);
  175. }
  176.  
  177. sub do_action {
  178.     my $obj = shift;
  179.     my $action = shift;
  180.     my @args = @_;
  181.  
  182.     if (! $obj || ! $obj->connect()) {
  183.         my ($err, $errstr) = $obj->get_last_error();
  184.         print STDERR "$0: Could not connect\n";
  185.         print STDERR "  (VMControl error $err: $errstr)\n";
  186.         exit(-$err);
  187.     }
  188.     
  189.     my @ret;
  190.  
  191.     eval {
  192.         @ret = $obj->$action(@args);
  193.         if (!defined($ret[0])) {
  194.             my ($err, $errstr) = $obj->get_last_error();
  195.             if ($err == VMware::Control::constant("VM_E_NOTCONNECTED", 0)) {
  196.                 $obj->connect(1);
  197.                 @ret = $obj->$action(@args);                
  198.             }
  199.         }
  200.     };
  201.     if ($@) {
  202.         #eval error
  203.         print STDERR "Error executing the command \"$action\"\n\n";
  204.         print STDERR $@ if ($verbose);
  205.         usage();
  206.     }
  207.  
  208.     if (!defined($ret[0])) {
  209.         my ($err, $errstr) = $obj->get_last_error();
  210.         print STDERR "VMControl error $err: $errstr\n";
  211.     $obj->disconnect( );
  212.         exit(-$err);
  213.     }
  214.  
  215.     print "$action(@args) = " unless ($quiet);
  216.     pretty_print(@ret);
  217.     print "\n";
  218.  
  219.     $obj->disconnect( );
  220. }
  221.  
  222. sub main {
  223.  
  224.   # Attempt to load the VMware::Control Perl libraries
  225.   eval {
  226.       require VMware::Control;
  227.       require VMware::Control::Server;
  228.       require VMware::Control::VM;
  229.   };
  230.   if ($@) {
  231.       print STDERR
  232.           "$0 requires the VMware::Control Perl libraries to be installed.\n";
  233.       print STDERR "Check that your installation did not encounter errors.\n";
  234.       exit(255);
  235.   }
  236.  
  237.   my $i;
  238.  
  239.   # Scan the command line
  240.   my @arguments = ();
  241.   my $list = 0;
  242.   my $server = 0;
  243.  
  244.   for ($i = 0; $i < $#ARGV + 1; $i++) {
  245.     if ($ARGV[$i] eq "--") {
  246.       last;
  247.     }
  248.     if ($ARGV[$i] eq "-v") {
  249.       $verbose = 1;
  250.       next;
  251.     }
  252.     if ($ARGV[$i] eq "-l") {
  253.       $list = 1;
  254.       next;
  255.     }
  256.     if ($ARGV[$i] eq "-s") {
  257.       $server = 1;
  258.       next;
  259.     }
  260.     if ($ARGV[$i] eq "-q") {
  261.       $quiet = 1;
  262.       next;
  263.     }
  264.     push @arguments, $ARGV[$i];
  265.   }
  266.  
  267.   # Check the options validity
  268.   if ($list) {
  269.       if ($#arguments != -1) {
  270.           usage();
  271.       }
  272.       do_list();
  273.   } else {
  274.       if ($server) {
  275.           #Require at least 1 argument (server-action)
  276.           if ($#arguments < 0) {
  277.               usage();
  278.           }
  279.           do_server_action(@arguments);
  280.       } else {
  281.           #Require at least 2 arguments (config file, vm-action)
  282.           if ($#arguments < 1) {
  283.               usage();
  284.           }
  285.           do_vm_action(@arguments);
  286.       }
  287.   }      
  288.   return 0;
  289. }
  290.  
  291. main();
  292.  
  293. __END__
  294.  
  295. =head1 NAME
  296.  
  297. vmware-control -- Command-line control of VMware virtual machines.
  298.  
  299. =head1 SYNOPSIS
  300.  
  301.     # List VMs registered on the local server
  302.     vmware-control -l
  303.  
  304.     # Find out if a particular VM is powered on.
  305.     vmware-control /home/vmware/win2000.cfg get Status.power
  306.  
  307.     # Same thing, but do not print the query (only print the result).
  308.     vmware-control -q /home/vmware/win2000.cfg get Status.power
  309.  
  310.     # Same thing, on windows:
  311.     vmware-control C:\home\vmware\win2000.vmx get Status.power
  312.  
  313.     # Power on a particular VM.  Be verbose.
  314.     vmware-control -v /home/vmware/win2000.cfg start
  315.  
  316.     # Same thing, on windows:
  317.     vmware-control -v C:\home\vmware\win2000.vmx start
  318.  
  319. =head1 DESCRIPTION
  320.  
  321. This program provides a simple command-line interface to most of the
  322. operations in the VMware::Control Perl module.
  323.  
  324. See the VMware Perl API documentation for more information.
  325.